<script>
		//静态方法
	
	//通过复制一个或多个对象来创建一个新的对象。
	//如果复制的对象包含引用数据类型，指针还是指向同一个地址
	let obj1 = {a:'1'}
	let obj2 = Object.assign({},obj1)
	obj2.a = '2'
	// console.log(obj1);//{a: "1"}
	// console.log(obj2);//{a: "2"}
	




	//使用指定的原型对象和属性创建一个新对象。
	//复制的对象指针指向同一个地址
	const person = {
		isHuman: false,
	};
	const me = Object.create(person);
	me.__proto__.isHuman = true
	// console.log(me.__proto__);//{isHuman: true}
	// console.log(person);//{isHuman: true}





	// 给对象添加一个属性并指定该属性的配置。
	const object1 = {};
	Object.defineProperty(object1, 'property1', {
		value: 42,
		writable: false
	});
	object1.property1 = 77;
	// console.log(object1.property1);//42



	
	//给对象添加多个属性并分别指定它们的配置。
	let obj = {};
	Object.defineProperties(obj, {
		'property1': {
			value: true,
			writable: true
		},
		'property2': {
			value: 'Hello',//指定属性配置,与get方法作用相同
			writable: false,//是否允许修改，与set方法作用相同
			configurable:false,//是否允许删除
			enumerable:false,//是否可枚举
		}
	});
	delete obj.property2
	// console.log(obj);
	


	//返回给定对象自身可枚举属性的 [key, value] 数组。
	const object2 = {
		a: 'somestring',
		b: 42
	};
	const entriesList = Object.entries(object2)
	// console.log(entriesList);//[["a", "somestring"],["b", 42]]
	
	


	//冻结对象：其他代码不能删除或更改、添加任何属性。
	//如果属性是引用数据类型，则可以操作
	const objFreeze = {
		prop: {}
	};
	Object.freeze(objFreeze);
	objFreeze.prop.b = 33;
	// console.log(objFreeze.prop.b);//33




	//返回对象指定的属性配置。
	const object13 = {
		property1: 42
	};
	const descriptor1 = Object.getOwnPropertyDescriptor(object13, 'property1');
	// console.log(descriptor1.configurable);//true
	//Object.getOwnPropertyDescriptors() 方法用来获取一个对象的所有自身属性的描述符。



	//返回一个数组，它包含了指定对象所有的可枚举或不可枚举的属性名。
	var arr = ["a", "b", "c"];
	// console.log(Object.getOwnPropertyNames(arr)); // ["0", "1", "2", "length"]
	var namesobj = { 0: "a", 1: "b", 2: "c"};
	// console.log(Object.getOwnPropertyNames(namesobj)); // ["0", "1", "2"]	




	// /返回一个数组，它包含了指定对象自身所有的符号属性。
	var symbolobj = {};
	var a = Symbol("a");
	var b = Symbol.for("b");
	symbolobj[a] = "localSymbol";
	symbolobj[b] = "globalSymbol";
	var objectSymbols = Object.getOwnPropertySymbols(symbolobj);
	// console.log(objectSymbols);





	//返回指定对象的原型对象。
	const prototypeOf = {};
	const object4 = Object.create(prototypeOf);
	// console.log(Object.getPrototypeOf(object4) === prototypeOf);//true
	//Object.setPrototypeOf() 方法设置一个指定的对象的原型
	let obj = {name:'定海神针'}
	let dict = Object.setPrototypeOf({}, obj);
	console.log(dict);


	//比较两个值是否相同。所有 NaN 值都相等（这与==和===不同）。
	// console.log(Object.is('a','a'));//true
	// console.log(Object.is({},{}));//false,这里比较的是指针
	



	//判断对象是否可扩展
	var empty = {};
	console.log(Object.isExtensible(empty));//true// 新对象默认是可扩展的.
	// ...可以变的不可扩展.
	Object.preventExtensions(empty);
	Object.isExtensible(empty); // === false

	// 密封对象是不可扩展的.
	var sealed = Object.seal({});
	Object.isExtensible(sealed); // === false

	// 冻结对象也是不可扩展.
	var frozen = Object.freeze({});
	Object.isExtensible(frozen); // === false



	Object.isFrozen()
	//判断对象是否已经冻结。

	Object.isSealed()
	//判断对象是否已经密封。

	Object.keys()
	//返回一个包含所有给定对象自身可枚举属性名称的数组。

	Object.preventExtensions()
	//防止对象的任何扩展。

	Object.seal()
	//防止其他代码删除对象的属性。

	Object.values()
	//返回给定对象自身可枚举值的数组。
		
	
	
	//方法把键值对列表转换为一个对象。
	const entries = new Map([
		['foo', 'bar'],
	]);
	const obj = Object.fromEntries(entries);
	console.log(obj);//{foo: "bar"}



	//hasOwnProperty() 方法会返回一个布尔值，指示对象自身属性中是否具有指定的属性
	const object1 = {};
	object1.property1 = 42;
	console.log(object1.hasOwnProperty('property1'));//true




	//propertyIsEnumerable() 方法返回一个布尔值，表示指定的属性是否可枚举。
	const object1 = {};
	object1.property1 = 42;
	console.log(object1.propertyIsEnumerable('property1'));//true



	


</script>